package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"path/filepath"
	"strings"
	"time"

	"github.com/inntu/backend/config"
	"github.com/inntu/backend/utils"
	"gorm.io/gorm"
)

// Item 数据库模型
type Item struct {
	ID   uint   `gorm:"primaryKey"`
	Name string `gorm:"column:name"`
	Icon string `gorm:"column:icon"`
}

func main() {
	ctx := context.Background()

	// 1. 创建COS客户端
	cosClient, err := utils.NewCOSClient("zyx")
	if err != nil {
		log.Fatalf("创建COS客户端失败: %v", err)
	}

	// 2. 连接数据库
	db, err := connectDB()
	if err != nil {
		log.Fatalf("连接数据库失败: %v", err)
	}

	// 3. 获取icons目录路径
	iconsDir := "ntu/src/static/icons"
	absIconsDir, err := filepath.Abs(iconsDir)
	if err != nil {
		log.Fatalf("获取icons目录绝对路径失败: %v", err)
	}

	// 4. 遍历icons目录
	err = filepath.Walk(absIconsDir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		// 跳过目录
		if info.IsDir() {
			return nil
		}

		// 只处理PNG文件
		if !strings.HasSuffix(strings.ToLower(info.Name()), ".png") {
			return nil
		}

		// 上传文件到COS
		err = uploadIconToCOS(ctx, cosClient, path, info.Name())
		if err != nil {
			log.Printf("上传文件 %s 失败: %v", info.Name(), err)
			return nil // 继续处理其他文件
		}

		// 更新数据库
		err = updateItemIcon(db, info.Name())
		if err != nil {
			log.Printf("更新数据库记录 %s 失败: %v", info.Name(), err)
		}

		log.Printf("成功处理文件: %s", info.Name())
		return nil
	})

	if err != nil {
		log.Fatalf("遍历icons目录失败: %v", err)
	}

	log.Println("所有图标文件处理完成!")
}

// connectDB 连接数据库
func connectDB() (*gorm.DB, error) {
	// 使用项目配置初始化数据库
	dbConfig := config.GetDatabaseConfig()
	err := config.InitGormDatabase(dbConfig)
	if err != nil {
		return nil, err
	}
	return config.GetGormDB(), nil
}

// uploadIconToCOS 上传图标文件到COS
func uploadIconToCOS(ctx context.Context, cosClient *utils.COSClient, filePath, fileName string) error {
	// COS对象键
	cosKey := fmt.Sprintf("icons/%s", fileName)

	// 上传选项
	uploadOpts := &utils.UploadOptions{
		ContentType: "image/png",
		ACL:         "public-read", // 设置为公共读权限
		Metadata: map[string]string{
			"source":      "ntu-icons",
			"upload-time": time.Now().Format(time.RFC3339),
		},
	}

	// 上传文件
	err := cosClient.PutObjectFromFile(ctx, cosKey, filePath, uploadOpts)
	if err != nil {
		return fmt.Errorf("上传文件到COS失败: %v", err)
	}

	log.Printf("文件 %s 已上传到COS: %s", fileName, cosKey)
	return nil
}

// updateItemIcon 更新数据库中的icon字段
func updateItemIcon(db *gorm.DB, fileName string) error {
	// 构建COS URL
	cosURL := fmt.Sprintf("https://ntu-1325732121.cos.ap-guangzhou.myqcloud.com/icons/%s", fileName)

	// 查找匹配的items记录
	// 根据现有数据，icon字段格式为: ../../static/icons/xxx.png
	oldIconPattern := fmt.Sprintf("../../static/icons/%s", fileName)

	// 更新匹配的记录
	result := db.Model(&Item{}).Where("icon = ?", oldIconPattern).Update("icon", cosURL)
	if result.Error != nil {
		return fmt.Errorf("更新数据库失败: %v", result.Error)
	}

	if result.RowsAffected > 0 {
		log.Printf("已更新 %d 条记录的icon字段: %s -> %s", result.RowsAffected, oldIconPattern, cosURL)
	} else {
		log.Printf("未找到匹配的记录: %s", oldIconPattern)
	}

	return nil
}